package com.guet.config;

import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

/**
 * @author MicahYin
 * @date 2020/8/7 20:50
 */
/**
 * 这些配置是基于AOP的，面向切面编程，不会改变原来的代码
 * */

/**
 * //加入如下注解，可以在Controller中使用注解来控制权限，可以使用@Secured与@RolesAllowed注解，两者用法基本相同
 * // @EnableGlobalMethodSecurity(securedEnabled = true,jsr250Enabled = true,prePostEnabled = true)
 * 另外@PreAuthorize、@PostAuthorize，两个注解支持在注解中加入表达式，可以更加灵活的控制权限，比如可以指定
 * 限制只能查询Id小于10的用户    @PreAuthorize("#id<10")
 * 限制只能查询自己的信息        @PreAuthorize("principal.username.equals(#username)")
 * 详细可以参考博客：https://blog.csdn.net/weixin_39220472/article/details/80873268
 */
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter{
        @Override
    protected void configure(HttpSecurity http) throws Exception {
//        springSecurity的配置类

        http.authorizeRequests()
                .antMatchers("/").permitAll()
                .antMatchers("/level1/**").hasRole("vip1")
                .antMatchers("/level2/**").hasRole("vip2")
                .antMatchers("/level3/**").hasRole("vip3");
//        无权限则跳转到登录页面
    /**此处可以指定登录页面以及登录操作绑定的事件，还可以通过.usernameParameter()等参数来设置前端页面的参数*/
        http.formLogin().loginPage("/toLogin").loginProcessingUrl("/login");
        http.csrf().disable();
        //这里也可以通过.rememberMeParameter()来配置前端的参数
        http.rememberMe();
//        //开启了注销功能,注销成功跳到首页
        http.logout().logoutSuccessUrl("/");
    }
/**
 * 如下代码是配置认证用户数据来源以及数据加密方式
 * */
//    @Bean
//    public BCryptPasswordEncoder passwordEncoder() {
//        return new BCryptPasswordEncoder();
//    }
//
//    // 认证用户的来源(内存或者数据库)
//    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
//        auth.userDetailsService(userService).passwordEncoder(passwordEncoder);
//    }


    //认证
//    security5.0+必须对密码进行加密，使用BCryptPasswordEncoder等方法
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
//            auth.userDetailsService()
        auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder())
                .withUser("micah").password(new BCryptPasswordEncoder().encode("1234")).roles("vip2","vip3")
                .and()
                .withUser("root").password(new BCryptPasswordEncoder().encode("1234")).roles("vip1","vip2","vip3")
                .and()
                .withUser("guest").password(new BCryptPasswordEncoder().encode("1234")).roles("vip1");
    }
}
